/* Laboratorio # 2 - Administración de bases de datos
 Jorge Fallas Ramos         402090469
 José Roberto Sánchez       115400070
 Daniel Villalobos Venegas  402110100
 */
package monitorinitdb.Vista;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;

public class VentScripts extends JFrame implements ActionListener {

    private static VentScripts instance;

    ArrayList<JTextField> Scripts;
    /*
     @/u01/app/oracle/product/12.1.0/db_1/rdbms/admin/catalog.sql
     @/u01/app/oracle/product/12.1.0/db_1/rdbms/admin/dbmsstdx.sql
     @/u01/app/oracle/product/12.1.0/db_1/rdbms/admin/catproc.sql
     @/u01/app/oracle/product/12.1.0/db_1/sqlplus/admin/pupbld.sql

     */
    JFileChooser selArchivo;
    String[] nomScripts = {"catalog.sql", "dbmsstdx.sql", "catproc.sql", "pupbld.sql"};

    public static VentScripts getInstance() {
        if (instance == null) {
            instance = new VentScripts();
        }
        return instance;
    }

    public static String[] getScripts() {
        if (instance != null) {
            return instance.Scripts();
        }
        return null;
    }

    private VentScripts() throws HeadlessException {
        setTitle("Ventana Scripts");
        Scripts = new ArrayList<>();
        configSelArchivo();
        configInicial();
        configComponentes();
    }

    private void configComponentes() {
        JPanel pnScripts = new JPanel();
        pnScripts.setLayout(new BoxLayout(pnScripts, BoxLayout.Y_AXIS));
        for (String s : nomScripts) {
            pnScripts.add(panelScript(s));
        }
        pnScripts.setBorder(BorderFactory.createRaisedSoftBevelBorder());
        add(pnScripts, BorderLayout.CENTER);
        add(new JLabel("<html>ADVERTENCIA: ESTE PASO SE PUEDE OMITIR, PERO DE NO INCLUIR ESTOS ARCHIVOS, ALGUNAS FUNCIONES DE ORACLE NO ESTARAN DISPONIBLES<br><br>Defina las direcciones de los siguientes archivos de Oracle<br>Estos generalmente estan en la carpeta: <br>$ORACLE_HOME$/rdbms/admin/</html>"), BorderLayout.NORTH);
        JButton b = new JButton("Continuar");
        b.addActionListener(this);
        add(b, BorderLayout.SOUTH);
    }

    private void configInicial() {
        setPreferredSize(new Dimension(500, 400));
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        setResizable(false);
        addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                setVisible(false);
                VentConfig.getInstance().mostrar();
            }

        });
    }

    private JPanel panelScript(String nombre) {
        JPanel p = new JPanel();
        p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
        p.add(new JLabel(nombre + ":"));
        JTextField tex = new JTextField();
        tex.setPreferredSize(new Dimension(150, 35));
        Scripts.add(tex);
        tex.setName(nombre);
        p.add(tex);
        p.setBorder(BorderFactory.createEtchedBorder());
        tex.setEditable(false);
        p.add(btOpen(nombre));
        p.setMaximumSize(new Dimension(500, 35));
        return p;
    }

    private JButton btOpen(String name) {
        JButton b = new JButton("Seleccionar Archivo");
        b.setActionCommand("Seleccionar Archivo");
        b.setName(name);
        b.addActionListener(this);
        return b;
    }

    public void mostrar() {
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        VentScripts.getInstance().mostrar();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        switch (e.getActionCommand()) {
            case "Seleccionar Archivo": {
                JButton b = (JButton) e.getSource();
                cambiaArchivo(b.getName());
            }
            break;
            case "Continuar": {
                setVisible(false);
                VentConfig.getInstance().mostrar();
            }
            break;
            default:
                throw new UnsupportedOperationException("Comando " + e.getActionCommand() + "no valido");
        }
    }

    private void cambiaArchivo(String name) {
        try {
            File f = obtArchivo();
            if (f != null) {
                for (JTextField tex : Scripts) {
                    if (tex.getName().equals(name)) {
                        tex.setText(f.getAbsolutePath());
                        break;
                    }
                }
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
        }
    }

    private void configSelArchivo() {
        selArchivo = new JFileChooser();
        selArchivo.setDialogType(JFileChooser.OPEN_DIALOG);
        selArchivo.setFileFilter(new FileNameExtensionFilter("Archivo SQL", "sql"));
    }

    private File obtArchivo() throws Exception {
        int status = selArchivo.showOpenDialog(null);
        if (status == JFileChooser.APPROVE_OPTION) {
            File f = selArchivo.getSelectedFile();
            for (String s : nomScripts) {
                if (s.toLowerCase().equals(f.getName().toLowerCase())) {
                    return f;
                }
            }
            throw new Exception("Archivo " + f.getName() + " no valido!");
        }
        return null;
    }

    public String[] Scripts() {
        String[] scr = new String[Scripts.size()];
        for (int i = 0; i < Scripts.size(); i++) {
            scr[i] = Scripts.get(i).getText();
        }
        return scr;
    }
}
